package main

import (
	"fmt"
	"time"
)

// 自定义结构体，用于封装控制标识
type ControlFlag struct {
	stop bool
}

func main() {
	// ControlFlag对象
	controlFlag := &ControlFlag{false}

	// 启动子协程执行匿名函数，并将ControlFlag对象传入匿名函数
	go func(control *ControlFlag) {
		m1(control)
		m2(control)
		m3(control)
	}(controlFlag)

	// 主协程休眠3秒，子协程便可获得执行机会
	time.Sleep(3 * time.Second)

	// 外部环境对控制标识做出修改，向子协程传递停止标识
	controlFlag.stop = true

	// 主协程继续休眠，以便观察子协程的执行情况
	time.Sleep(100 * time.Second)
}

func m1(control *ControlFlag) {
	// 模拟耗时操作
	for i := 0; i < 10; i++ {
		// 如果停止标识为true，则跳出函数执行，子协程执行结束
		if control.stop {
			return
		}
		time.Sleep(1000 * time.Millisecond)
		fmt.Println("m1 : ", i)
	}
}

func m2(control *ControlFlag) {
	// 模拟耗时操作
	for i := 0; i < 20; i++ {
		// 如果停止标识为true，则跳出函数执行，子协程执行结束
		if control.stop {
			return
		}
		time.Sleep(1000 * time.Millisecond)
		fmt.Println("m2 : ", i)
	}
}

func m3(control *ControlFlag) {
	// 如果停止标识为true，则跳出函数执行，子协程执行结束
	if control.stop {
		return
	}
	for i := 0; i < 30; i++ {
		time.Sleep(1000 * time.Millisecond)
		fmt.Println("m3 : ", i)
	}
}
